// #include"BlockQueue.hpp"
// #include"Task.hpp"

// using namespace std;

// const std::string ops = "+-*/%";

// //消费者
// void* consumer(void* args)
// {
//     BlockQueue<Task>* bqp = static_cast<BlockQueue<Task>*> (args);
//     while(true)
//     {
//         Task t = bqp->pop(); //消费任务
//         int result = t();//处理任务, 任务也是要花时间的
//         int one, two;
//         char op;
//         t.get(&one, &two, &op);
        

//     }
// }

// //生产者
// void* productor(void* args)
// {

// }


// int main()
// {
//     srand((unsigned long)time(nullptr) ^ getpid());

//     BlockQueue<Task> bq;
//     pthread_t c, p;

//     pthread_create(&c, nullptr, consumer, &bq);
//     pthread_create(&c, nullptr, productor, &bq);

//     pthread_join(c, nullptr);
//     pthread_join(p, nullptr);

//     return 0;
// }



// #include"BlockQueue.hpp"
// #include"Task.hpp"
// #include<unistd.h>
// #include<string>
// #include<ctime>
// #include<cstdlib>
// #include<iostream>

// using namespace std;

// const string ops = "+-*/%";

// void* consumer(void* args)
// {
//     BlockQueue<Task>* bqp = static_cast<BlockQueue<Task>*>(args);

//     while(true)
//     {
//         Task t = bqp->pop();//消费任务
//         int result = t();//调用仿函数-处理任务
//         int one, two;
//         char op;
//         t.get(&one, &two, &op);
        
//         cout << "consumer[" << pthread_self() <<"]" \
//         << (unsigned int)time(nullptr) << "消费了一个任务" \
//         << one << op << two << "=" << result << endl;
//     }
// }


// void* productor(void* args)
// {
//     BlockQueue<Task>* bqp = static_cast<BlockQueue<Task>*>(args);

//     while(true)
//     {
//         //1.制作任务
//         int one = rand() % 50;
//         int two = rand() % 20;
//         char op = ops[rand() % ops.size()];

//         Task t(one, two, op);

//         //2.生产任务
//         bqp->push(t);
//         cout << "productor[" << pthread_self() << "]" \
//         << (unsigned int)time(nullptr) << "生产了一个任务" \
//         << one << op << two << "=?" << endl;

//         sleep(1);
//     }
// }

// int main()
// {
//     srand((unsigned long)time(nullptr) ^ getpid());

//     BlockQueue<Task> bq;
//     pthread_t c, p;

//     pthread_create(&c, nullptr, consumer, &bq);
//     pthread_create(&p, nullptr, productor, &bq);

//     pthread_join(c, nullptr);
//     pthread_join(p, nullptr);

//     return 0;
// }


#include"Task.hpp"
#include"BlockQueue.hpp"
#include<ctime>
#include<cstdlib>
#include<unistd.h>
#include<pthread.h>

const string ops = "+-*/%";

//并发,并不是在临界区中并发(一般),而是生产前(before blockqueue),消费后(after blockqueue)对应的并发
void* consumer(void* args)
{
    BlockQueue<Task>* bqp = static_cast<BlockQueue<Task>*>(args);

    while(true)
    {
        Task t = bqp->pop(); // 消费任务
        int result = t(); // 调用仿函数 -- 处理任务,任务也是要花时间的
        int one, two;
        char op;
        t.get(&one, &two, &op);
        cout << "consumer[" << pthread_self() << "]" << (unsigned long)time(nullptr) \
            << "消费了一个任务:" << one << op << two << "=" << result << endl;
    }
}

void* productor(void* args)
{
    BlockQueue<Task>* bqp = static_cast<BlockQueue<Task>*>(args);
    
    while(true)
    {
        //1.制作任务要不要花时间?网络, 磁盘, 用户
        int one = rand() % 50;
        int two = rand() % 20;
        char op = ops[rand() % ops.size()];
        Task t(one,two,op);

        //2.生产任务
        bqp->push(t);
        cout << "productor[" << pthread_self() << "]" << (unsigned long)time(nullptr) \
            << "生产了一个任务:" << one << op << two << "=?" << endl;

        sleep(1);
;    }
}

int main()
{
    srand((unsigned long)time(nullptr) ^ getpid());

    BlockQueue<Task> bq;
    pthread_t c, p;

    pthread_create(&c, nullptr, consumer, (void*)&bq);
    pthread_create(&p, nullptr, productor, (void*)&bq);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);

    return 0;
}